package managed.bean;

import com.marlboroug.articlesbyauthors.ArticlesByAuthorsRemote;
import com.marlboroug.authors.AuthorsManagerRemote;
import com.marlboroug.entity.Articlesbyauthors;
import com.marlboroug.entity.Authors;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

/**
 * Gestion des éditeurs.
 *
 * @author Cyril Schumacher
 */
@ManagedBean
@SessionScoped
public class AuthorManager implements Serializable {
    // <editor-fold defaultstate="collapsed" desc="Membres.">
    /**
     * Gestion des editeurs.
     */
    @EJB
    private AuthorsManagerRemote _authorsManager;
    /**
     * Gestion des articles avec les auteurs.
     */
    @EJB
    private ArticlesByAuthorsRemote _articlesByAuthorsManager;
    /**
     * Informations sur l'éditeur.
     */
    private Authors author;
    /**
     * Liste des auteurs existants.
     */
    private ArrayList<Authors> authors;
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="Accesseurs/Mutateurs.">
    /**
     * Obtient les informations d'un auteur.
     *
     * @return Retourne les informations d'un auteur.
     */
    public Authors getAuthor() {
        return author;
    }

    /**
     * Définit une informations d'un auteur.
     *
     * @param author Informations d'un auteur.
     */
    public void setAuthor(Authors author) {
        this.author = author;
    }

    /**
     * Obtient une liste des auteurs existants.
     *
     * @return Retourne une liste des auteurs.
     */
    public ArrayList<Authors> getAuthors() {
        return authors;
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="Méthodes.">
    // <editor-fold defaultstate="collapsed" desc="Privées.">
    private void _refresh() {
        authors = new ArrayList<>(_authorsManager.findAll());
    }

    // </editor-fold>
    /**
     * Supprime un auteur.
     *
     * @param id Identifiant de l'auteur.
     */
    public void delete(Long id) {
        int id_article3 = 0;
        List<Articlesbyauthors> verifArticle3 = _articlesByAuthorsManager.ArticlesFindAuthor(id);
        for (Articlesbyauthors p : verifArticle3) {
            id_article3 = p.getIDarticlesbyauthors().intValue();
        }
        if (id_article3 == 0) {
            _authorsManager.delete(Long.valueOf(id));
            _refresh();
        } else {

            // Récupère les informations contextuelles associées au traitement 
            // de la requête pour pouvoir gérer les erreurs/informations.
            FacesContext context = FacesContext.getCurrentInstance();
            // Si l'utilisateur n'a pas pu être créer, on signale l'erreur à 
            // l'utilisateur.
            context.addMessage("id", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Une erreur est survenue lors de la suppression.", null));
        }
    }

    /**
     * Met à jour les informations d'un auteur.
     *
     * @param author Auteur a modifier.
     */
    public void update(Authors author) {
        if (_authorsManager.update(author)) {
            _refresh();
        } else {
            // Récupère les informations contextuelles associées au traitement 
            // de la requête pour pouvoir gérer les erreurs/informations.
            FacesContext context = FacesContext.getCurrentInstance();
            // Si l'utilisateur n'a pas pu être créer, on signale l'erreur à 
            // l'utilisateur.
            context.addMessage("id", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Une erreur est survenue lors de la mise à jour.", null));
        }
    }

    /**
     * Créer un auteur.
     *
     * @return Retourne une chaîne de caractère pour le contrôle JSF.
     */
    public String create() {
        if (_authorsManager.create(getAuthor())) {
            _refresh();
            setAuthor(new Authors());
            return "success";
        }
        // Récupère les informations contextuelles associées au traitement 
        // de la requête pour pouvoir gérer les erreurs/informations.
        FacesContext context = FacesContext.getCurrentInstance();
        // Si l'utilisateur n'a pas pu être créer, on signale l'erreur à 
        // l'utilisateur.
        context.addMessage("id", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Une erreur est survenue lors de la création.", null));
        return "failure";
    }

    /**
     * Initialise la classe.
     */
    @PostConstruct
    public void initialize() {
        setAuthor(new Authors());
        _refresh();
    }
    // </editor-fold>
}
